package exception;
/**
 * 使用当前类测试异常的输出
 *
 * 异常分类：
 * 可检测异常：可检测异常经编译器验证，对于声明抛出异常的任何方法，编译器将强制执行处理或声明
 * 规则，不捕捉这个异常，编译器就通不过，不允许编译
 * 非检测异常：非检测异常不遵循处理或者声明规则。在产生此类异常时，不一定非要采取任何适当操
 * 作，编译器不会检查是否已经解决了这样一个异常
 *
 * RuntimeException类属于非检测异常
 * 常见的RuntimeException子类：
 * IllegalArgumentException：抛出的异常表明向方法传递了一个不合法或不正确的参数
 * NullPointerException：当应用程序试图在需要对象的地方使用 null 时，抛出该异常
 * ArrayIndexOutOfBoundsException：当使用的数组下标超出数组允许范围时，抛出该异常
 * ClassCastException：当试图将对象强制转换为不是实例的子类时，抛出该异常
 * NumberFormatException：当应用程序试图将字符串转换成一种数值类型，但该字符串不能
 * 转换为适当格式时，抛出该异常
 */
public class Person {
    private int age;
    public int getAge() {
        return this.age;
    }

    //public void setAge (int age) {
      // public void setAge (int age) throws Exception{ //抛出了一个Exception异常
    //除了RuntimeException以外，当主动使用throw抛出异常时，
    //编译器要求必须在方法中使用throws来声明该异常的抛出，以便通知调用者处理
      public void setAge (int age) throws IllegalAgeException{
        /*
        除了RuntimeException以外,当主动使用throw抛出异常时，
        编译器要求必须必须必须在该方法中使用throws来声明该异常的抛出,以便通知调用者处理
         throw：用来对外主动抛出一个异常，通常下面两种情况我们主动对外抛出异常：
         当程序遇到一个满足语法，但是不满足业务要求时，可以抛出一个异常告知调用者。
         程序执行遇到一个异常，但是该异常不应当在当前代码片段被解决时可以抛出给调用者。

         9. throws：用来在声明方法时同时声明该方法可能抛出的异常，用于通知调用方添加处理该异常的手段。
          当一个方法中使用throw抛出一个非RuntimeException的异常时，就要在该方法上使用throws声明这个
          异常的抛出。此时调用该方法的代码就必须处理这个异常，否则编译不通过
         */
        if (age<0 ||age>100){
            //throw new RuntimeException("年龄必须在0-1000之间"); //走到这里了就不会往下走了
            //throw  new Exception("年龄必须在0-1000之间");
            throw new IllegalAgeException("年龄必须在0-100之间");
        }
        this.age = age; //这里就不会执行
    }


}
